perm filename KWIC.PRG[T,LSP]1 blob sn#627071 filedate 1981-11-30 generic text, type T, neo UTF8
  KWIC: PROCEDURE OPTIONS (MAIN);
     /*A PROGRAM TO FORMAT A KWIC INDEX*/

     DECLARE
        DIR(10) FIXED (3,0),/*DIRECTORY ARRAY*/
        I FIXED (2,0),/*COUNTER*/
        BIB CHAR (134) VARYING,/*BIBLIOGRAPHICAL MATERIAL*/
        TRUE BIT (1),/*SWITCH TRANSLATION*/
        FALSE BIT (1),/*SWITCH TRANSLATION*/
        OKOK BIT (1),/*END FLAG*/
        KEYWORDS(500,2) CHAR(50) VARYING,/*KWIC ELEMENTS*/
        FILL FIXED (3,0),/*COUNTER FOR ARRAY*/
        STOPWORDS(7) CHAR(10) INIT ('A','AN','AND','FOR',
            'OF','THE','TO'),/*NON INDEXED TERMS*/
        STOPWORDLENGTH FIXED BIN(32);/*SIZE OF STOPWD ARRAY*/

   /*INITIALIZE VARIABLES*/

     I = 0;
     DIR = 0;
     BIB←PART = 0;
     OKOK = '1'B;
     TRUE = '1'B;
     FALSE = '0'B;
     DIR(10) = 0;                                            
     FILL = 1;
     STOPWORDLENGTH = 7;

     ON ENDFILE (SYSIN) OKOK = FALSE;

 
        GET EDIT ((DIR (I) DO I = 1 TO 9),BIB)
           (9 F(3,0),A(133));

  MRCTIME:/*GRAB TITLE & LCCN OUT OF BIB MATERIAL*/
     DO WHILE (OKOK);

     USEDIR
        CALL SEPARATE (SUBSTR(BIB,DIR(3),DIR(4)-DIR(3)),
                       SUBSTR(BIB,DIR(7),DIR(8)-DIR(7)));
        GET EDIT ((DIR (I) DO I = 1 TO 9),BIB)
                 (9 F(3,0),A(133));
        END USEDIR;

    CALL SORT(KEYWORDS,FILL-1);

    CALL PRINT←IT(KEYWORDS,FILL-1);

 END MRCTIME;

 /*DIVIDE TITLES INTO KEYWORDS & STICK IN AN ARRAY WITH LCCN*/
 SEPARATE: PROCEDURE (TITLE,LCCN);

     DECLARE
        TITLE CHAR(50) VARYING,
        LCCN  CHAR(12) VARYING,
        POSITION FIXED (3,0),
        WORD CHAR(20) VARYING,


    POSITION = INDEX(TITLE,` ');

    SAMURAI: DO WHILE (POSITION ¬= 0);/*CHOP UP TITLE*/
       WORD = SUBSTR(TITLE,1,POSITION - 1);

    /*SCAN FOR STOPWORDS*/
    CALL MEMBER (WORD,STOPWORDS,STOPWORDLENGTH,RESULT);

    IF (RESULT = FALSE) THEN /*FILL ARRAY ACCEPTABLE WDS*/
       DO;
       KEYWORDS(FILL,1) = WORD;
       KEYWORDS(FILL,2) = LCCN;
       FILL = FILL + 1;
       END;
    TITLE = SUBSTR(TITLE,POSITION + 1);
    POSITION = INDEX(TITLE,` ');
    END SAMURAI;
 END SEPARATE; 

 MEMBER: PROCEDURE (ITEM,SET,N,RESULT);
    DECLARE 
       SET(*) CHAR (50) VARYING,
       N FIXED BINARY (32), /*NO. OF STOPWORDS IN ARRAY*/
       I FIXED BINARY (32),/*ARRAY COUNTER*/
       DONE BIT (1),/*SWITCH*/
       RESULT BIT (1),
       ITEM CHAR (50) VARYING;

 /*INITIALIZE VARIABLES*/
    RESULT = FALSE;
    DONE = FALSE;
    I = 1;

    TEST: DO WHILE ((I <= N) | DONE);
        IF (ITEM = SET(I)) THEN DO; DONE = TRUE;
                                    RESULT = TRUE;
                                END;
        I = I + 1;
    END TEST;
 END MEMBER;
 SORT: PROCEDURE (ARRAY,LOC);
     DECLARE
        ARRAY(*,2) CHAR(50) VARYING,/*KEYWDS & LCCNS*/
        TEMP CHAR(50) VARYING,/*FOR SHUFFLING AROUND ARRAY ITEMS*/
        LOC FIXED BIN(32),/*POINTER TO ARRAY*
        PASS FIXED BIN(32),/*LOOKING OVER ARRAY*/
        J FIXED BIN(32),/*COUNTER*/
        GO BIT(1);/*SWITCH*/

    GO = TRUE;

    OUT←OF←SORTS:  DO PASS = 1 TO LOC - 1
                      WHILE (GO);

                     GO = FALSE;


    EACH←PASS: DO J = 1 TO LOC - PASS;
       IF ARRAY(J,1) > ARRAY(J + 1,1) THEN
          DO;
          GO = TRUE;
          TEMP = ARRAY(J,1);
          ARRAY(J,1) = ARRAY(J + 1,1);
          ARRAY(J + 1,1) = TEMP;
          TEMP = ARRAY(J,2);
          ARRAY(J,2) = ARRAY(J + 1,2);
          ARRAY(J + 1,2) = TEMP;
          END;
       END EACH←PASS;
    END OUT←OF←SORTS;
 END SORT;
 PRINT←IT: PROCEDURE(WORDS,FINDEM)

   DECLARE
     WORDS(*,2) CHAR(50) VARYING,
     FINDEM FIXED BIN(32);

   FINDEM = 1;

   PUT SKIP LIST
      (WORDS(FINDEM,1));
   PUT SKIP LIST
      ('     '||WORDS(FINDEM,2));

   LIST: DO I = 1 TO FINDEM;
       IF WORDS(FINDEM,1) ¬= WORDS((FINDEM + 1),1) THEN
          DO;
            PUT SKIP(2) LIST (WORDS(FINDEM,1));
            PUT SKIP LIST ('     '||WORDS(FINDEM,2);
          END;
       ELSE PUT SKIP LIST ('     '||WORDS(FINDEM,2);
       FINDEM = FINDEM + 1;
   END LIST;
 END PRINT←IT;
 END KWIC;